package com.czh;

import com.czh.dao.AccountDao;
import com.czh.pojo.Account;
import com.czh.pojo.test;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Demo {

    static {
        String resource = "mybatis-config.xml";
        try {
            inputStream = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static InputStream inputStream;
    private static SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    private static SqlSession session = sqlSessionFactory.openSession();
    private static AccountDao accountDao = session.getMapper(AccountDao.class);

//    二级缓存第二个session
    private static SqlSession session2 = sqlSessionFactory.openSession();
    private static AccountDao accountDao2 = session2.getMapper(AccountDao.class);


    /**
     * 实体类别名
     * sql动态标签(需注解@Param("id")指定字段名称,<where></where>)
     * 分页插件
     */
    public static void main(String[] args){
//        分页入参
        PageHelper.startPage(2,1);
        List<Account> list = accountDao.findAll(null,null);
        list.stream().forEach(System.out::println);
        session.close();
    }

    /**
     * sql动态标签（<foreach></foreach>）,支持数组，list集合
     */
    @Test
    public void selectList(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        int [] array = new int[]{1,2,3};
        List<Account> accountList = accountDao.finByIdList(array);
        accountList.stream().forEach(System.out::println);
    }

    /**
     * 驼峰命名（bySum字段）
     * 根据id查询
     * @Param("id")注解使用
     * 二级缓存（注：需要给实体类继承Serializable接口，和一级缓存一样，增删改后也会清空二级缓存）
     */
    @Test
    public void findId(){
//        第一次查询
        Account byId = accountDao.findById(1);
        System.out.println(byId);
        //关闭连接
        session.close();
        //第二次查询
        Account byId2 = accountDao2.findById(1);
        System.out.println(byId2);

    }

    /**
     * 根据名称查询
     * sql注解查询
     * 一级缓存（增删改后也会清除缓存，哪怕增删改为false也会清除缓存）
     */
    @Test
    public void findName(){
        //查询
        Account byName1 = accountDao.findByName("旅行者");
        System.out.println(byName1);

        //修改
        Account account = new Account();
        account.setId(60);
        account.setName("派蒙");
        account.setEmail("123@163.com");
        boolean bool = accountDao.updateUser(account);
//        提交
        session.commit();
        System.out.println(bool);

        //清除缓存
//        session.clearCache();
        //查询
        Account byName2 = accountDao.findByName("旅行者");
        System.out.println(byName2);
    }

    /**
     * 添加数据
     * sql片段截取（<sql></sql>）
     */
    @Test
    public void insert(){
        Account account = new Account();
        boolean bool = accountDao.insertUser(account);
//        提交
        session.commit();
        System.out.println(bool);
    }

    /**
     * 删除数据
     */
    @Test
    public void delete(){
        boolean bool = accountDao.deleteUserId(35);
        session.commit();
        System.out.println(bool);
    }

    /**
     * 更新数据
     * sql动态标签（<set></set>）
     */
    @Test
    public void update(){
        Account account = new Account();
        account.setId(33);
        account.setName("派蒙");
        account.setEmail("123@163.com");
        boolean bool = accountDao.updateUser(account);
//        提交
        session.commit();
        System.out.println(bool);
    }

    /**
     * 根据id查多表（一对一）
     */
    @Test
    public void tableById(){
        Account account = accountDao.tableById(1);
        System.out.println(account);
    }

    /**
     * 多表查询,一对多
     */
    @Test
    public void tableList(){
        Account account = accountDao.tableList(2);
        account.getTestList().stream().forEach(System.out::println);
    }

    /**
     * 分布查询
     */
    @Test
    public void releaseSelect(){
        test test = accountDao.releaseSelect("小米");
//        System.out.println(test.getAccountName());
        test.getAccountList().stream().forEach(account -> {
            System.out.println(account.getId());
            System.out.println(account.getName());
        });
    }
}
